home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / scheme / pcscheme / geneva / sources.exe / SOURCES / BGI / SPY.CPP < prev   
Encoding:
C/C++ Source or Header  |  1993-03-03  |  6.4 KB  |  317 lines

  1. /************************************************************************
  2.  *            The C routines dispatched to            *
  3.  ************************************************************************/
  4.  
  5. #define    BREAKPOINT    asm int 3
  6.  
  7. typedef    unsigned _ss    &INT;
  8. typedef unsigned char _ss    &BYTE;
  9. typedef    union {
  10.     unsigned    u;
  11.     unsigned char    b[2];
  12.     } _ss        ®
  13. typedef    void far * _ss    &FP;
  14. typedef    enum { OK, ERROR }    RVALUE;
  15.  
  16. typedef void    (*HANDLER)(...);
  17.  
  18. typedef    struct {
  19.     char    *name;
  20.     struct {
  21.         int    reserved1;
  22.         int    ncols, nrows, pcols, prows;
  23.         int    width, height, ratio;
  24.         long    reserved2;
  25.         }    mode;
  26.     }    MODE;
  27.  
  28. extern "C" void    emulate(...);
  29. extern "C" void    bitmaputl(...);
  30.  
  31. unsigned    write( int fd, char far *buf )
  32. {
  33.     for( int len = 0; buf[len]; len++ );
  34. asm {
  35.     push    ds
  36.     mov    ah, 40h
  37.     mov    bx, fd
  38.     mov    cx, len
  39.     lds    dx, buf
  40.     int    21h
  41.     pop    ds
  42.     jc    error
  43. }
  44.     return    _AX;
  45. error:
  46.     return    -1;
  47. }
  48.  
  49. char _ss    *putint( char _ss *p, unsigned n, unsigned base )
  50. {
  51.     if( base == 10 && n > 32768 )
  52.     {
  53.         *p++ = '-';
  54.         return    putint( p, -n, base );
  55.     }
  56.     if( n >= base )
  57.         p = putint( p, n / base, base );
  58.     *p++ = '0' + (n % base);
  59.     return    p;
  60. }
  61.  
  62. void    printf( int stream, char *format, ... )
  63. {
  64.     char    s[100], _ss *p;
  65.     int _ss    *arg = ...;
  66.  
  67.     for( p = s; *format; format++ )
  68.     if( *format == '%')
  69.     {
  70.         if( *++format == '%')
  71.             *p++ = *format;
  72.         else switch( *format )
  73.         {
  74.         case 'c':
  75.             *p++ = *arg++;
  76.             break;
  77.         case 'd':
  78.             p = putint( p, *arg++, 10 );
  79.             break;
  80.         case 'x':
  81.             p = putint( p, *arg++, 16 );
  82.             break;
  83.         case 's':
  84.         {
  85.             int    ofs = *arg++;
  86.             char far *q = (char _seg *) *arg++ + ofs;
  87.  
  88.             while( (*p++ = *q++) != 0 );
  89.             p--;
  90.         }
  91.         }
  92.     }
  93.     else    *p++ = *format;
  94.     *p = 0;
  95.     write( stream, s );
  96. }
  97.  
  98. RVALUE    install( BYTE subfunc, REG, BYTE mode, REG, FP string )
  99. {
  100.     static MODE    Modes[] = {
  101.         {"\005SPY", { 0, 999, 999, 999, 999, 5000, 5000, 10000, 0x90900808 } }
  102.         };
  103.  
  104.     switch( subfunc )
  105.     {
  106.     case 0:                // perform init
  107.         printf( 2, "<BGI@INSTALL %d>\r\n", mode );
  108.         string = &Modes[mode].mode;
  109.         break;
  110.     case 1:                // get maximum mode in 'mode'
  111.         printf( 2, "<BGI@GETMODES>\r\n");
  112.         mode = sizeof(Modes)/sizeof(MODE);
  113.         break;
  114.     case 2:                // get string for 'mode' in 'string'
  115.         printf( 2, "<BGI@MODESTR %d>\r\n", mode );
  116.         string = Modes[mode].name;
  117.     }
  118.     return    OK;
  119. }
  120.  
  121. void    init( INT, INT, INT, INT, FP parms )
  122. {
  123.     printf( 2, "<BGI@INIT>\r\n");
  124. }
  125.  
  126. void    clear()
  127. {
  128.     printf( 2, "<BGI@CLEAR>\r\n");
  129. }
  130.  
  131. void    post()
  132. {
  133.     printf( 2, "<BGI@POST>\r\n");
  134. }
  135.  
  136. void    move( INT x, INT y )
  137. {
  138.     printf( 2, "<BGI@MOVE (%d,%d)>\r\n", x, y );
  139. }
  140.  
  141. void    draw( INT x, INT y )
  142. {
  143.     printf( 2, "<BGI@DRAW (%d,%d)>\r\n", x, y );
  144. }
  145.  
  146. void    vect( INT x0, INT y0, INT x1, INT y1 )
  147. {
  148.     printf( 2, "<BGI@VECT (%d,%d)-(%d,%d)>\r\n", x0, y0, x1, y1 );
  149. }
  150.  
  151. void    bar( INT x, INT y, INT width, INT top )
  152. {
  153.     printf( 2, "<BGI@BAR (%d,%d),%d%s>\r\n", x, y, width,
  154.         !top && width ? (char far *) ",TOP" : (char far *) "");
  155. }
  156.  
  157. void    patbar( INT x0, INT y0, INT x1, INT y1 )
  158. {
  159.     printf( 2, "<BGI@PATBAR (%d,%d)-(%d,%d)>\r\n", x0, y0, x1, y1 );
  160. }
  161.  
  162. void    arc( INT a0, INT a1, INT xrad, INT yrad )
  163. {
  164.     printf( 2, "<BGI@ARC %d-%d,(%d,%d)>\r\n", a0, a1, xrad, yrad );
  165. }
  166.  
  167. void    pieslice( INT a0, INT a1, INT xrad, INT yrad )
  168. {
  169.     printf( 2, "<BGI@SLICE %d-%d,(%d,%d)>\r\n", a0, a1, xrad, yrad );
  170. }
  171.  
  172. void    filledellipse( INT xrad, INT yrad )
  173. {
  174.     printf( 2, "<BGI@FILLEDELLIPSE (%d,%d)>\r\n", xrad, yrad );
  175. }
  176.  
  177. void    palette( INT index, INT value )
  178. {
  179.     printf( 2, "<BGI@PALETTE %d=%d>\r\n", index, value );
  180. }
  181.  
  182. void    allpalette( INT, INT, INT, INT, FP p )
  183. {
  184.     printf( 2, "<BGI@ALLPALETTE>\r\n");
  185. }
  186.  
  187. void    color( REG colors )
  188. {
  189.     printf( 2, "<BGI@COLORS %d,%d>\r\n", colors.b[0], colors.b[1] );
  190. }
  191.  
  192. void    fillstyle( BYTE patnum, INT pattern )
  193. {
  194.     printf( 2, "<BGI@FILLSTYLE %d,%x>\r\n", patnum, pattern );
  195. }
  196.  
  197. void    linestyle( INT patnum, INT style, INT width )
  198. {
  199.     printf( 2, "<BGI@LINESTYLE %d,%d,%d>\r\n", patnum, style, width );
  200. }
  201.  
  202. void    textstyle( REG num_dir, INT xsize, INT ysize )
  203. {
  204.     printf( 2, "<BGI@TEXTSTYLE %d,%s,%d,%d>\r\n", num_dir.b[0],
  205.         num_dir.b[1] ? (char far *) "VERT" : (char far *) "HORIZ", xsize, ysize );
  206. }
  207.  
  208. void    text( INT, INT, INT length, INT, FP string )
  209. {
  210.     printf( 2, "<BGI@TEXT %d %s>\r\n", length, string );
  211. }
  212.  
  213. void    textsiz( INT, INT, INT length, INT, FP string )
  214. {
  215.     printf( 2, "<BGI@TEXTSIZ %d %s>\r\n", length, string );
  216. }
  217.  
  218. void    reserved( INT ax, INT bx, INT cx, INT dx, FP es_bx )
  219. {
  220.     printf( 2, "<BGI@RESERVED>\r\n");
  221. }
  222.  
  223. void    floodfill( INT x, INT y, BYTE border )
  224. {
  225.     printf( 2, "<BGI@FLOODFILL (%d,%d),%d>\r\n", x, y, border );
  226. }
  227.  
  228. void    getpixel( INT x, INT y, INT, BYTE result )
  229. {
  230.     printf( 2, "<BGI@GETPIXEL (%d,%d)>\r\n", x, y );
  231. }
  232.  
  233. void    putpixel( INT x, INT y, INT, BYTE color )
  234. {
  235.     printf( 2, "<BGI@PUTPIXEL (%d,%d),%d>\r\n", x, y, color );
  236. }
  237.  
  238. void    getimage( INT, INT, INT x, INT y, FP image )
  239. {
  240.     printf( 2, "<BGI@GETIMAGE (%d,%d)>\r\n", x, y );
  241. }
  242.  
  243. void    putimage( INT, INT, INT x, INT y, FP image )
  244. {
  245.     printf( 2, "<BGI@PUTIMAGE (%d,%d)>\r\n", x, y );
  246. }
  247.  
  248. void    setclip( INT x0, INT y0, INT x1, INT y1 )
  249. {
  250.     printf( 2, "<BGI@SETCLIP (%d,%d)-(%d,%d)>\r\n", x0, y0, x1, y1 );
  251. }
  252.  
  253. void    colorquery( BYTE query, INT, INT, INT, FP table )
  254. {
  255.     printf( 2, "<BGI@COLORQUERY %d>\r\n", query );
  256. }
  257.  
  258. void    _putpixel( int x, int y, char color )
  259. {
  260.     printf( 2, "<BGI@_PUTPIXEL (%d,%d),%d>\r\n", x, y, color );
  261. }
  262.  
  263. int    _getpixel( int x, int y )
  264. {
  265.     printf( 2, "<BGI@_GETPIXEL (%d,%d)>\r\n", x, y );
  266.     return    0;
  267. }
  268.  
  269. int    _getpixelwidth()
  270. {
  271.     printf( 2, "<BGI@_PIXELWIDTH>\r\n");
  272.     return    0;
  273. }
  274.  
  275. void    _setwritemode( int mode )
  276. {
  277.     printf( 2, "<BGI@_SETWRITEMODE %d>\r\n", mode );
  278. }
  279.  
  280. HANDLER    dispatch[] = {
  281.     (HANDLER) install,
  282.     (HANDLER) init,
  283.     (HANDLER) clear,
  284.     (HANDLER) post,
  285.     (HANDLER) move,
  286.     (HANDLER) draw,
  287.     (HANDLER) vect,
  288.     (HANDLER) emulate,
  289.     (HANDLER) bar,
  290.     (HANDLER) patbar,
  291.     (HANDLER) arc,
  292.     (HANDLER) pieslice,
  293.     (HANDLER) filledellipse,
  294.     (HANDLER) palette,
  295.     (HANDLER) allpalette,
  296.     (HANDLER) color,
  297.     (HANDLER) fillstyle,
  298.     (HANDLER) linestyle,
  299.     (HANDLER) textstyle,
  300.     (HANDLER) text,
  301.     (HANDLER) textsiz,
  302.     (HANDLER) reserved,
  303.     (HANDLER) floodfill,
  304.     (HANDLER) getpixel,
  305.     (HANDLER) putpixel,
  306.     (HANDLER) bitmaputl,
  307.     (HANDLER) getimage,
  308.     (HANDLER) putimage,
  309.     (HANDLER) setclip,
  310.     (HANDLER) colorquery };
  311.  
  312. HANDLER    fardispatch[] = {
  313.     (HANDLER) _putpixel,
  314.     (HANDLER) _getpixel,
  315.     (HANDLER) _getpixelwidth,
  316.     (HANDLER) _setwritemode };
  317.